/***********************************************************************************
 * 文件名： touch_key_config.h
 * 版本： 4
 * 说明：
 * 		触摸键控制组件，提供环境自适应、超时重置、电压波动补偿等功能，提供一个稳定可靠的触摸
 * 	键是否按下的状态。建议配合 btn_ctrl 组件进行使用，在配合使用时，本组间提供按钮是否按下的
 * 	状态供查询。
 *      在配置文件中进行配置，针对POLSYS_LITE，需要间隔10~40ms调用 TouchKey_Scan 。使用示
 * 	例请见 POLSYS 项目中的 projects\touch_key_demo .
 * 修改记录：
 * 	2021/08/20: 初版。 刘言。
 *  2021/10/15: 增加 TouchKey_SetScanStatus API；增加 _TOUCH_KEY_VOLTAGE_SENSITIVITY 配置项。
 *  2022/02/10：增加 动态灵敏度以及诸多配置项；增加 _TouchKey_PauseCondition API
 *  2022/06/06: 去掉发送捕获值功能；新增 _TOUCH_KEY_USE_SET_STATUS；占用优化。刘言。
***********************************************************************************/
#ifndef _TOUCH_KEY_CONFIG_H_
#define _TOUCH_KEY_CONFIG_H_

#include "board.h"

/////////////////////////////////////// 功能开关

// 定义表示启用设置状态功能。开启后可以设置扫描启停状态。注释掉可以节省资源。
// #define _TOUCH_KEY_USE_SET_STATUS

// 启用 上电等待基准值稳定 功能
// #define _TOUCH_KEY_USE_POWS
    // 稳定值判断标准 ±n
    #define _TOUCH_KEY_PO_STABLE_VALUE          2
    // 连续次数表示稳定 // 最大255
    #define _TOUCH_KEY_PO_STABLE_COUNT          50 
    // 等待最大次数 // 最大255
    #define _TOUCH_KEY_PO_MAX_WAIT_COUNT        255     

// 开启动态灵敏度
//#define _TOUCH_DYNAMIC_SENSITIVITY
    // 持续释放多长时间开始检测是否稳定，单位ms
    #define _TOUCH_RELEASE_START_DETECTION      1000
    // 最值产生多长时间后赋值为基准值（防止缓慢触发时基准值变动）
    #define _TOUCH_REF_MAX_VALUE_LATER_TIME     2000
    // 起始波动值，波动大于这个值才开始调整阈值
    #define _TOUCH_INITIAL_FLUCTUATION_VALUE    0
    // 波动值对应阈值的倍率，阈值=基础值(最小值)+波动值X倍率
    #define _TOUCH_THRESHOLD_MULTIPLE           1
    // 增加灵敏度时间间隔，单位ms
    #define _TOUCH_RELEASE_INCREASED_INTERVAL   10000
        // 阈值灵敏度一次增量
        #define _TOUCH_KEY_VALID_INCREMENT      1
    // 各通道阈值最小值（最灵敏）
    #define _TOUCH_KEY_VALID_MIN_VALUE_CH0	    5
    #define _TOUCH_KEY_VALID_MIN_VALUE_CH1	    11
    // 各通道阈值最大值（最不灵敏）
    #define _TOUCH_KEY_VALID_MAX_VALUE_CH0	    14
    #define _TOUCH_KEY_VALID_MAX_VALUE_CH1	    20

// 开启异常触发保护
//#define _TOUCH_HOLD_ABNORMAL_PROTECTION
    // 触发后 开始计时，一定时间内做误触发判断，单位ms
    #define _TOUCH_HOLD_PERIOD_TIME             200
    // 触发后 设定时间内，触发时间大于等于这个值，认为正常触发，单位ms
    #define _TOUCH_HOLD_CUMULATIVE_TIME         100
    // 触发后，持续释放超过一定时间，清除计时，单位ms
    #define _TOUCH_RELEASE_PERIOD_TIMEOUT       90

// 定义表示启用VDD电压补偿。
// 如果操作触摸键会导致VDD电压明显波动，开启后可以有效降低误判几率。
// 原理是电压每变化 _TOUCH_KEY_VOLTAGE_SENSITIVITY,基准值变化千分之一。
//#define _TOUCH_KEY_USE_VOLTAGE_COMPENSATE
    // 电压灵敏度，单位mV。电压每变化这么多，基准值变化千分之一。
    #define _TOUCH_KEY_VOLTAGE_SENSITIVITY  23


//////////////////////////////////////////// 参数设置

// 通道数量。触摸键数量。
#define _TOUCH_KEY_CH_NUM                   _CAPSS_CH_NUM

// 扫描间隔，单位ms，若使用 POLSYS_LITE 需填入你调用扫描函数 TouchKey_Scan 的真实间隔。
#define _TOUCH_KEY_SCAN_INTERVAL 	        10		

// 各通道有效增量
#define _TOUCH_KEY_VALID_VALUE_CH0	        7	//通道0
#define _TOUCH_KEY_VALID_VALUE_CH1	        11	//通道1

// 各通道无效增量
#define _TOUCH_KEY_INVALID_VALUE_CH0	    5
#define _TOUCH_KEY_INVALID_VALUE_CH1	    8

// 按下超时重置基准值的超时时间（适用于所有通道），单位ms
#define _TOUCH_KEY_RESET_TIMEOUT	        15000	

// 按下有效次数，连续检测到多次按下才认为真的按下，可避免偶尔的采样错误，可设置最小值为1
#define _TOUCH_KEY_DOWN_VALID_CNT           2

// 松手有效次数，连续检测到多次松手才认为真的松手，可避免偶尔的采样错误，可设置最小值为1
#define _TOUCH_KEY_UP_VALID_CNT             1

//松手时重置基准值间隔时间，单位ms
#define _TOUCH_KEY_RESET_REF_INTERVAL	    4000	

// 安全重置偏差。
// 松手时，可以安全重置基准值的差值最小值。
// 差值高于这个值会直接重置基准，低于这个值需要更长时间的确定来重置基准。
// 合理设置可避免错误的重置基准到一个较低的值，下一次采样值较高直接误认为按下。
#define _TOUCH_KEY_SAFE_RESET_DIFF          (-3)


// 需要的 API

// 在这个条件下暂停，可设置为false或者直接屏蔽，即不暂停 2021年10月27日新增，黄均铭。
//#define _TouchKey_PauseCondition()        (false)

#define _TouchKey_CapSSInit()               CapSS_Init()
#define _TouchKey_CapSSGetValue(u8_ch)      CapSS_GetValue()

#ifdef _TOUCH_KEY_USE_VOLTAGE_COMPENSATE
// 获取VDD电压，单位mV
#define _TouchKey_GetVDDVoltage()           Adc_GetVDDVoltage()
#endif

#endif
